Accelerators, such as graphics processing units (GPUs), have surpassed computer processing units (CPUs) as a source of high-density computing resources. The proliferation of fast GPU hardware has been accompanied by the emergence of general purpose GPU (GPGPU) frameworks, enabling programmers to write high-performance code for GPU hardware. However, despite the success of GPUs in supercomputing environments, GPU hardware and programming environments are not routinely integrated into many other types of systems because of programming difficulty, lack of modularity, and unpredictable performance artifacts.
Current systems for programming GPUs rely on vendor-provided tools that require programmers to write code that explicitly controls the movement of data to and from the GPU, in addition to providing the code that runs on the GPU itself. Because of this explicit control of data movement, programmers using these systems sacrifice either performance, or modularity and reusability. Coupling of data movement code with algorithm code is also a barrier to providing higher-level programming environments.